﻿using System;
using System.Linq;
using System.Windows.Forms;

namespace Sigos
{
    public partial class frmVendas : Form
    {
        public frmVendas()
        {
            InitializeComponent();
        }

        Utilidades util = new Utilidades();

        private void CarregaCFOP(string CodigoCFOP)
        {
            using (SigosEntities Entidades = new SigosEntities())
            {
                try
                {
                    var CFOPs = Entidades.CFOP.Where(Cod => Cod.Codigo == CodigoCFOP).FirstOrDefault();
                    txtExpCFOP.Text = CFOPs.Descricao.ToUpper();
                }
                catch
                {
                    util.Erro("Não foi possivel selecionar a tabela de CFOP's");
                }
            }
        }

        private void CarregaProdsPedido(string vNumeroPedido)
        {
            using (SigosEntities Entidades = new SigosEntities())
            {
                decimal totalV = 0;
                decimal preco = 0;
                lstProdutos.Items.Clear();
                int Codigo = int.Parse(vNumeroPedido);
                var ProdutosPedido = Entidades.PedidoDetalhes.Where(Ped => Ped.CodigoPedido == Codigo).ToList();
                int Contador = 0;
                //var total = ProdutosPedido.Sum(Ped => Ped.ValorUnitario);
                var QtdTotal = ProdutosPedido.Sum(Ped => Ped.Quantidade);
                //txtValorTotal.Text = total.ToString();
                txtQuantidadeTotal.Text = QtdTotal.ToString();
                foreach (PedidoDetalhes Ped in ProdutosPedido)
                {
                    Contador++;
                    ListViewItem Item = new ListViewItem();
                    Item.Text = Ped.CodProdInsercao.ToString();
                    Item.SubItems.Add(Contador.ToString());
                    Item.SubItems.Add(Ped.Produtos2.Descricao);
                    Item.SubItems.Add(Ped.ValorUnitario.ToString());
                    Item.SubItems.Add(Ped.Quantidade.ToString());
                    decimal Qtd = decimal.Parse(Ped.Quantidade.ToString());
                    decimal Total = Ped.ValorUnitario * Qtd;
                    Item.SubItems.Add(Total.ToString());

                    lstProdutos.Items.Add(Item);
                    string Vvalor = Item.SubItems[5].Text;                    
                    preco = decimal.Parse(Vvalor);                   
                    totalV = totalV + preco;

                    txtValorTotal.Text = totalV.ToString();
                }

            }
        }

        private void CarregaDadosCliente(string vCodigoCliente)
        {
            if (vCodigoCliente == "")
            {
                //util.Erro("Informe o código do cliente antes de prossguir");
            }
            else
            {
                using (SigosEntities Entidades = new SigosEntities())
                {
                    try
                    {
                        int Codigo = int.Parse(vCodigoCliente);
                        var vCliente = Entidades.Clientes.Where(cli => cli.Codigo == Codigo).FirstOrDefault();

                        txtRazaoCliente.Text = vCliente.RazaoSocial;
                        btnFormarPedido.Focus();
                    }
                    catch
                    {
                        util.Erro("Não foi possivel localizar o cliente com o código informado, informe um código válido e tente novamente!");
                    }
                }
            }
        }

        private void CarreganatOperacao()
        {
            using (SigosEntities Entidades = new SigosEntities())
            {
                var natOP = Entidades.natOperacao.ToList();
                cboTipoNFe.DataSource = natOP;
                cboTipoNFe.DisplayMember = "NetOperacao";
                cboTipoNFe.ValueMember = "Codigo";
            }
        }

        private void FormasdePagamento()
        {
            using(SigosEntities Entidades = new SigosEntities())
            {
                var Formas = Entidades.FormasPagamento.ToList();
                cboCodicaoPagamento.DataSource = Formas;
                cboCodicaoPagamento.DisplayMember = "Descricao";
                cboCodicaoPagamento.ValueMember = "Codigo";
            }
        }

        public void CriarPedido()
        {
            try
            {
                using (SigosEntities Entidades = new SigosEntities())
                {
                    /////////////////
                    PedidoCabeca pC = new PedidoCabeca();
                    pC.CodigoCliente = int.Parse(txtCodigoCliente.Text);
                    pC.CondPagamento = int.Parse(cboCodicaoPagamento.SelectedValue.ToString());
                    int CFOP = int.Parse(txtNCFOP.Text.Replace(".", ""));
                    pC.CFOP = CFOP;
                    pC.Observacoes = txtObservacoes.Text;
                    pC.DataHoraPedido = DateTime.Now;
                    pC.Status = "O";
                    pC.Vendedor = Utilidades.Usuario;
                    pC.natOperacao = int.Parse(cboTipoNFe.SelectedValue.ToString());
                    /////////////////
                    Entidades.AddObject("PedidoCabeca", pC);
                    Entidades.SaveChanges();
                    var vUltimoPedido = (from P in Entidades.PedidoCabeca
                                         orderby P.CodigoPedido descending
                                         select new { P.CodigoPedido }).FirstOrDefault();  
                    ////////////////
                    lblNumeroPedido.Text = vUltimoPedido.CodigoPedido.ToString();
                    lblNumeroPedido.Visible = true;
                    btnFormarPedido.Enabled = false;
                    gpCliente.Enabled = false;
                    gpOutrosDados.Enabled = false;
                    btnInserirProdutos.Focus();
                    ///////////////
                    btnInserirProdutos.Enabled = true;
                    btnExcluirProduto.Enabled = true;
                    btnFecharPedido.Enabled = true;
                }
            }
            catch (Exception ex)
            {
               util.Erro("Erro ao criar pedido, o erro foi" + ex.Message);
            }
        }

        private void CarregaPedido(string vIDPedido)
        {
            using (SigosEntities Entidades = new SigosEntities())
            {
                if (txtCodigoPedido.Text != string.Empty)
                {
                    int CodigoPedido = int.Parse(txtCodigoPedido.Text);
                    try
                    {
                        var Pedido = Entidades.PedidoCabeca.Where(P => P.CodigoPedido == CodigoPedido).FirstOrDefault();
                        txtCodigoCliente.Text = Pedido.CodigoCliente.ToString();
                        txtRazaoCliente.Text = Pedido.Clientes.RazaoSocial;
                        cboTipoNFe.SelectedValue = Pedido.natOperacao;
                        txtNFeReferenciada.Text = Pedido.ChaveNFe;
                        txtNCFOP.Text = Pedido.CFOP.ToString();
                        CarregaCFOP(txtNCFOP.Text);
                        txtObservacoes.Text = Pedido.Observacoes;
                        cboCodicaoPagamento.SelectedValue = Pedido.CondPagamento;
                        CarregaProdsPedido(txtCodigoPedido.Text);
                        lblNumeroPedido.Visible = true;
                        lblNumeroPedido.Text = Pedido.CodigoPedido.ToString();
                        gpCliente.Enabled = false;
                        gpOutrosDados.Enabled = false;
                        btnFormarPedido.Enabled = false;

                        if (Pedido.Status == "O") // Orçamento
                        {
                            btnInserirProdutos.Enabled = true;
                            btnExcluirProduto.Enabled = true;
                            btnFecharPedido.Enabled = true;
                        }

                        else if (Pedido.Status == "F") //Fechado
                        {
                            btnInserirProdutos.Enabled = false;
                            btnExcluirProduto.Enabled = false;
                            btnFecharPedido.Enabled = false;
                        }

                    }
                    catch
                    {
                        util.Erro("Impossivel Carregar o pedido selecionado");

                    }
                }
            }
        }

        private void ExcluirProduto(string vIdProduto)
        {       
            
            if(util.Excluir()){
            using (SigosEntities Entidades = new SigosEntities())
            {
                try
                {
                    int CodigoPro = int.Parse(vIdProduto);
                    var Excluir = Entidades.PedidoDetalhes.Where(Prod => Prod.CodProdInsercao == CodigoPro).FirstOrDefault();
                    Entidades.DeleteObject(Excluir);
                    Entidades.SaveChanges();
                    util.Informacao("Registro excluido com sucesso");
                    CarregaProdsPedido(lblNumeroPedido.Text);
                }
                catch
                {
                    util.Erro("Impossivel excluir o registro selecionado");
                }
            }
            }
        }
        
        private void btnLocalizarCliente_Click_1(object sender, EventArgs e)
        {
            using (frmPesquisaCliente PesqCliente = new frmPesquisaCliente())
            {
                PesqCliente.ShowDialog();
                txtCodigoCliente.Text = Utilidades.NumeroPedido;
                CarregaDadosCliente(txtCodigoCliente.Text);
                btnInserirProdutos.Focus();
            }
        }

        private void frmVendas_Load_1(object sender, EventArgs e)
        {
            CarreganatOperacao();
            FormasdePagamento();
            cboTipoNFe.SelectedValue = 1;
            CarregaCFOP(txtNCFOP.Text);
            btnInserirProdutos.Enabled = false;
            btnExcluirProduto.Enabled = false;
            btnFecharPedido.Enabled = false;
        }

        private void txtCodigoCliente_Leave_1(object sender, EventArgs e)
        {
            CarregaDadosCliente(txtCodigoCliente.Text);
        }

        private void btnFormarPedido_Click_1(object sender, EventArgs e)
        {
            CriarPedido();
        }

        private void btnInserirProdutos_Click(object sender, EventArgs e)
        {
            try
            {
                Utilidades.NumeroPedido = lblNumeroPedido.Text;
                using (frmProdutosPedido BuscaProds = new frmProdutosPedido())
                {
                    BuscaProds.ShowDialog();
                    CarregaProdsPedido(Utilidades.NumeroPedido);
                }
            }
            catch
            {
                util.Erro("Houve um erro inesperado ao inserir os produtos no pedido");
            }
            finally
            {
                Utilidades.NumeroPedido = null;
            }

        }

        private void txtCodigoCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            util.SoNumeros(e);
        }

        private void btnExcluirProduto_Click(object sender, EventArgs e)
        {
            ExcluirProduto(lstProdutos.SelectedItems[0].Text);
        }

        private void btnFecharPedido_Click(object sender, EventArgs e)
        {
            int CodigoPedidoFechar = int.Parse(lblNumeroPedido.Text);
            using (SigosEntities Entidades = new SigosEntities())
            {
                try
                {
                    bool Confirma = util.Confirmacao("O pedido será fechado! Continuar?");
                    if (Confirma == true)
                    {                    
                    btnInserirProdutos.Enabled = false;
                    btnExcluirProduto.Enabled = false;
                    btnFormarPedido.Enabled = false;
                    btnFecharPedido.Enabled = false;
                    var PedidoFechar = Entidades.PedidoCabeca.Where(Pf => Pf.CodigoPedido == CodigoPedidoFechar).FirstOrDefault();
                    PedidoFechar.Status = "F"; //Fechado
                    //if (txtDesconto.Text != string.Empty)
                    //{
                    //    PedidoFechar.Desconto = decimal.Parse(txtDesconto.Text);
                    //}
                    Entidades.SaveChanges();
                    }
                }
                catch
                {
                    util.Erro("Erro ao fechar o pedido");
                }
            }
        }

        private void btnCodigoPedido_KeyPress(object sender, KeyPressEventArgs e)
        {
            util.SoNumeros(e);
        }

        private void btnCarregarPedido_Click(object sender, EventArgs e)
        {
            CarregaPedido(lblNumeroPedido.Text);
        }

        private void cboTipoNFe_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            if (cboTipoNFe.SelectedValue.ToString() == "2")
            {
                txtNFeReferenciada.Enabled = true;
            }
            else
            {
                txtNFeReferenciada.Enabled = false;
            }
        }

        private void txtNCFOP_Leave(object sender, EventArgs e)
        {
            CarregaCFOP(txtNCFOP.Text);
        }

        private void btnLocalizarPedido_Click(object sender, EventArgs e)
        {
            using (frmPesquisaPedidos PesqPedidos = new frmPesquisaPedidos())
            {
                PesqPedidos.ShowDialog();
                txtCodigoPedido.Text = Utilidades.NumeroPedido;
                Utilidades.NumeroPedido = null;
                CarregaPedido(txtCodigoPedido.Text);
            }
        }

        private void btnEmitirNfe_Click(object sender, EventArgs e)
        {
            using (frmEmiteNF_e NFe = new frmEmiteNF_e())
            {
                //Utilidades.NumeroPedido = null;
                Utilidades.NumeroPedido = lblNumeroPedido.Text;
                NFe.ShowDialog();
                Utilidades.NumeroPedido = null;
            }
        }

    }
}
